package com.cskaoyan.javse.oop3._2inner._6anonymous._0introduction;

/**
 * @description: 匿名内部类（对象）
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *
 * 匿名对象是没有引用指向的对象,没有名字的对象
 * 匿名类是没有名字的类,而正常情况下类都是有名字的,只有在特殊情况下,才会允许匿名内,也就是匿名(局部)内部类
 * 所以,匿名内部类是特殊的局部内部类
 *
 * 匿名内部类的语法:
 * new 类(可以是抽象类)名/接口名(){
 *      //这里相当于类/接口的子类的类体
 *     //重写父类方法,或者定义新成员
 * };
 *
 * 语法解释:
 *      1.new表示创建对象,表示的是创建语法中"类名/接口名"的子类对象
 *      2.在匿名内部类的语法中，创建的实际上是一个子类对象，这个子类没有名字，所以它是一个匿名类的对象
 *          所以匿名内部类，说准确一点是“匿名内部类对象”
 *
 * 接下来就可以定义使用，当然它仍然是一个局部内部类，仍以方法内部定义为例子
 *
 *
 * 匿名内部类的具体的使用：
 *      1.可以直接在后面调用方法，访问它的成员（当一个匿名对象使用）
 *           这种访问方式，优点： 1.可以访问子类独有的成员 2.使用简单,不需要接收再去使用
 *              缺点：一次性，只能用一次，后面如果还想使用就用不了了
 *
 *      2.还可以用引用接收它然后使用，但是必须用它的父类引用接收
 *              优点： 可以多次使用
 *              缺点： 1.不能访问子类独有成员（是真的无法访问，无法强转)
 *                     2.稍微麻烦一点，需要引用接收再使用
 * 综上： 如果只想在局部位置使用一次该对象/或者需要访问子类独有成员，就不要接收，否则就要接收
 *
 */
public class Demo {
    public static void main(String[] args) {
        //创建A的匿名内部类对象
        new A() {
            //A的子类的类体
            int a;
            //static int d;
            static final int C = 10;

            public void test() {
                System.out.println("A的子类的独有方法");
            }
            @Override
            void method() {
                System.out.println("A的儿子");
            }
        }.test();


        A aInstance = new A() {
            //A的子类的类体
            int a;
            //static int d;
            static final int C = 10;

            public void test() {
                System.out.println("A的子类的独有方法");
            }

            @Override
            void method() {
                System.out.println("A的儿子");
            }
        };
        aInstance.method();

    }
}

class A {
    void method() {
        System.out.println("A");
    }
}